package jp.co.dailyReport.dailyReport.action;

import java.io.IOException;
import java.util.Vector;
import java.util.Calendar;
import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.DynaActionForm;
import jp.co.dailyReport.SystemCalendar;
import jp.co.dailyReport.Utilities;
import jp.co.dailyReport.DataUnavailableException;
import jp.co.dailyReport.PermissionException;
import jp.co.dailyReport.Mail;
import jp.co.dailyReport.MailManager;
import jp.co.dailyReport.dailyReport.DailyReport;
import jp.co.dailyReport.dailyReport.DailyReportManager;
import jp.co.dailyReport.dailyReport.DailyReportWorkItem;
import jp.co.dailyReport.dailyReport.DailyReportWorkItemManager;
import jp.co.dailyReport.staff.Staff;
import jp.co.dailyReport.staff.StaffManager;
import jp.co.dailyReport.workItem.WorkItem;
import jp.co.dailyReport.workItem.WorkItemManager;

/**
 * 日報登録確認ページのボタン（戻る、登録、登録してメール送信）
 * が押されたときの処理を管理するクラスです。
 */
public class DailyReportCompletionAction extends Action {

	private static Logger log = Logger.getLogger(DailyReportCompletionAction.class);

	/**
	 * 日報登録確認ページのボタン（戻る、登録、登録してメール送信）
	 * が押されたときの処理を制御します。<BR><BR>
	 * 
	 * 「戻る」ボタンが押された場合の処理：<BR>
	 * 日報情報をセッションから取得して、DynaActionFormオブジェクトのフィールドに設定します。<BR><BR>
	 * 「登録」ボタンが押された場合の処理：<BR>
	 * 日報クラスのインスタンスを生成し、DynaActionFormオブジェクトのフィールド値を設定します。<BR>
	 * 日報オブジェクトの日報IDフィールド値が0の場合、日報情報をDBに登録します。<BR>
	 * 日報オブジェクトの日報IDフィールド値が0でない場合、日報情報をDBから更新し、日報作業項目情報を削除します。<BR>
	 * 日報作業項目情報をDBに登録します。<BR>
	 * 追加作業項目情報がある場合は、作業項目情報をDBに登録します。<BR><BR>
	 * 「登録してメール送信」ボタンが押された場合の処理：<BR>
	 * 日報クラスのインスタンスを生成し、DynaActionFormオブジェクトのフィールド値を設定します。<BR>
	 * 日報オブジェクトの日報IDフィールド値が0の場合、日報情報をDBに登録します。<BR>
	 * 日報オブジェクトの日報IDフィールド値が0でない場合、日報情報をDBから更新し、日報作業項目情報を削除します。<BR>
	 * 日報作業項目情報をDBに登録します。<BR>
	 * 追加作業項目情報がある場合は、作業項目情報をDBに登録します。<BR>
	 * 日報情報のメール送信処理を実行します。
	 * 
	 * @param mapping このインスタンスを選択するために使用したActionMapping
	 * @param form 存在するならば、このリクエストのためのActionForm Bean
	 * @param request 処理しているHTTPリクエスト
	 * @param response 処理しているHTTPレスポンス
	 * @return ActionForwardインスタンス
	 * @throws IOException, ServletException
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

		log.debug("DailyReportCompletionAction start");
		HttpSession session = request.getSession();
		log.debug("session.getId() = " + session.getId());
		Staff staff = (Staff) session.getAttribute("LoginStaff");
		DailyReportWorkItem[] dailyReportWorkItem = (DailyReportWorkItem[]) session.getAttribute("dailyReportWorkItem");
		DynaActionForm doDailyReportActionForm = (DynaActionForm) form;

		String target = null;
		ActionErrors errors = new ActionErrors();
		Vector workItemList = new Vector();
		//「戻る」ボタンが押された時の処理
		if(request.getParameter("returnAdd") != null) {
			target = "returnAdd";
			//作業項目追加画面で「登録」ボタンが押された時の処理
			if(request.getParameter("workItemAdd") != null) {
				DailyReport dailyReport = (DailyReport)session.getAttribute("dailyReport");
				doDailyReportActionForm.set("workDateY", new Integer(dailyReport.getWorkDate().get(Calendar.YEAR)));
				doDailyReportActionForm.set("workDateM", new Integer(dailyReport.getWorkDate().get(Calendar.MONTH)+1));
				doDailyReportActionForm.set("workDateD", new Integer(dailyReport.getWorkDate().get(Calendar.DATE)));
				doDailyReportActionForm.set("workingStartHoursH", new Integer(dailyReport.getWorkingStartHours().get(Calendar.HOUR_OF_DAY)));
				doDailyReportActionForm.set("workingStartHoursM", new Integer(dailyReport.getWorkingStartHours().get(Calendar.MINUTE)));

				doDailyReportActionForm.set("workingEndHoursH", new Integer(dailyReport.getWorkingEndHours().get(Calendar.HOUR_OF_DAY)));
				doDailyReportActionForm.set("workingEndHoursM", new Integer(dailyReport.getWorkingEndHours().get(Calendar.MINUTE)));

				doDailyReportActionForm.set("dailyReportId", new Integer(dailyReport.getDailyReportId()));
				doDailyReportActionForm.set("staffId", new Integer(dailyReport.getStaffId()));
				doDailyReportActionForm.set("workDetail", dailyReport.getWorkDetail());
				doDailyReportActionForm.set("problem", dailyReport.getProblem());
				doDailyReportActionForm.set("toDo", dailyReport.getToDo());
				doDailyReportActionForm.set("comment", dailyReport.getComment());
			}
			request.setAttribute("staff", staff);
			request.setAttribute("systemCalendar", new SystemCalendar());
		} else {
			//「登録」ボタン、「登録してメール送信」ボタンが押された時の処理
			target = "completion";
			DailyReport dailyReport = new DailyReport();
			try {
				int workDateY = ((Integer)doDailyReportActionForm.get("workDateY")).intValue();
				int workDateM = ((Integer)doDailyReportActionForm.get("workDateM")).intValue();
				int workDateD = ((Integer)doDailyReportActionForm.get("workDateD")).intValue();

				Calendar workingStartHours = Utilities.getCalendarTime(workDateY,workDateM,workDateD,
											((Integer)doDailyReportActionForm.get("workingStartHoursH")).intValue(),
											((Integer)doDailyReportActionForm.get("workingStartHoursM")).intValue());
				workingStartHours.set(Calendar.SECOND,0);
				Calendar workingEndHours = Utilities.getCalendarTime(workDateY,workDateM,workDateD,
											((Integer)doDailyReportActionForm.get("workingEndHoursH")).intValue(),
											((Integer)doDailyReportActionForm.get("workingEndHoursM")).intValue());
				workingEndHours.set(Calendar.SECOND,0);
				dailyReport.setWorkDate(workingStartHours);
				dailyReport.setWorkingStartHours(workingStartHours);
				dailyReport.setWorkingEndHours(workingEndHours);

				dailyReport.setDailyReportId(((Integer)doDailyReportActionForm.get("dailyReportId")).intValue());
				dailyReport.setStaffId(((Integer)doDailyReportActionForm.get("staffId")).intValue());

				//ユーザの追加作業項目の稼働時間も加算
				Vector pjDailyReportWorkItemList = (Vector)session.getAttribute("pjDailyReportWorkItemList");
				DailyReportWorkItem[] drwi = (DailyReportWorkItem[])pjDailyReportWorkItemList.toArray(new DailyReportWorkItem[0]);
				double workingHours = 0;
				for (int i = 0; i < drwi.length; i++) {
					workingHours = workingHours + drwi[i].getWorkingHours();
				}
				if(dailyReportWorkItem!=null){
					dailyReport.setTotalWorkingHours(DailyReportWorkItemManager.calculate(dailyReportWorkItem) + workingHours);
				} else {
					dailyReport.setTotalWorkingHours(workingHours);
				}

				dailyReport.setWorkDetail((String)doDailyReportActionForm.get("workDetail"));
				dailyReport.setProblem((String)doDailyReportActionForm.get("problem"));
				dailyReport.setToDo((String)doDailyReportActionForm.get("toDo"));
				dailyReport.setComment((String)doDailyReportActionForm.get("comment"));

				int dailyReportId = dailyReport.getDailyReportId();
				String subjectPart = null;
				//日報登録処理
				if(dailyReportId==0){
					DailyReportManager.insert(staff,dailyReport);
					dailyReportId = DailyReportManager.loadMaxId();
					subjectPart = "日報";
				//日報更新処理
				}else{
					DailyReportManager.update(staff,dailyReport);
					subjectPart = "【訂正】日報";
				}
				if(dailyReportWorkItem!=null){
					for (int i = 0; i < dailyReportWorkItem.length; i++) {
						dailyReportWorkItem[i].setDailyReportId(dailyReportId);
						DailyReportWorkItemManager.insert(dailyReportWorkItem[i]);
					}
					dailyReport.setDailyReportWorkItems(dailyReportWorkItem);
				}
				//追加作業項目の挿入
				Vector pjWorkItemList = (Vector)session.getAttribute("pjWorkItemList");

				if(pjWorkItemList!=null){
					if(pjWorkItemList.size()!=0){
						WorkItem[] workItem = (WorkItem[])pjWorkItemList.toArray(new WorkItem[0]);
						for (int i = 0; i < workItem.length; i++) {
							workItem[i].setDisplayNm(WorkItemManager.loadMaxDisplayNm(workItem[i].getProjectId())+1);
							WorkItemManager.insert(workItem[i]);
							drwi[i].setDailyReportId(DailyReportManager.loadMaxId());
							drwi[i].setWorkItemId(WorkItemManager.loadMaxID());
							DailyReportWorkItemManager.insert(drwi[i]);
						}
					}
				}
				dailyReport.setDailyReportWorkItems(drwi);

				//「登録してメール送信」ボタンが押された時の処理
				if(request.getParameter("sendMail") != null) {
					Mail mail = new Mail();
					java.text.DateFormat df = new java.text.SimpleDateFormat("yyyyMMdd");
					String result = df.format(workingStartHours.getTime());
					String subject = subjectPart + result + Utilities.changeUniqueCharacter(StaffManager.load(dailyReport.getStaffId()).getName());
					mail.setDailyReportInfo(dailyReport);
					mail.setSubject(subject);
					MailManager.sendDailyReportInfoMail(mail);
				}
			} catch(PermissionException e) {
				log.error(e.toString());
			} catch (DataUnavailableException due) {
				log.error(due.getMessage());
			}
		}

		log.debug("DailyReportCompletionAction end");
		return mapping.findForward(target);
	}
}
